/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package imperio.eventos;

import imperio.Sistema;
import imperio.controlador.Cap;
import imperio.population.Individuo;
import imperio.simulador.Simulador;

/**
 *
 * @author Bernardo
 */
public class Mutacao extends Evento {

    public static float delta;

    public static float getDelta() {
        return delta;
    }

    public static void setDelta(float delta) {
        Mutacao.delta = delta;
    }
    
    /**Método construtor recebe um individuo como parâmetro e associa o evento de mutação a esse indivíduo.

     * @param  individuo Individuo - Individuo no qual o evento de mutação será associado.   

     */

    public Mutacao(Individuo individuo) {
        super(individuo);
        super.setTempo(Simulador.tempoCorrente +(1- Math.log(individuo.getConforto()))*delta);
    }
    
    /**Método de simulação do evento de mutação, no qual o indivíduo tem um sistema retirado 
     * 
     * aleatório e uniformemente de uma de suas patrulhas pi e colocado em outra patrulha pj
     * 
     * sendo i!=j.
     * 
     */

    @Override
    public void simularEvento() {

        Sistema temp;
        int i, j, rand;

        while (true) {
            i = (int) (Math.random() * (super.getIndividuo().getPatrulhas().size())) ;
            j = (int) (Math.random() * (super.getIndividuo().getPatrulhas().size()));
            rand = (int) (Math.random() * super.getIndividuo().getPatrulhas().get(i).getSistemasPatrulhados().size());
            if(rand != 0 && i != j)
                break;
        }   
        temp = (super.getIndividuo().getPatrulhas().get(i).getSistemasPatrulhados().remove(rand));
        super.getIndividuo().getPatrulhas().get(j).getSistemasPatrulhados().add(temp);
        super.getIndividuo().recalConforto();
        Cap.adcionarEvCap(new Mutacao(super.getIndividuo()));
        //Cap.sort();
    }

}
